// server.js
import express from 'express'
import bodyParser from 'body-parser'
import config from 'config'
import sqlite from './utils/sqlite.js' 
import crypto from 'crypto'

const db = sqlite(config.get('DB_PATH'))


const app = express();
const port = config.get('PORT')

// Используем middleware для обработки данных в теле запроса
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())
app.use((req, res, next) => {
  const authHeader = req.headers.authorization;

  if (!authHeader) return res.status(401).send('Требуется авторизация')

  const base64Credentials = authHeader.split(' ')[1];
  const credentials = Buffer.from(base64Credentials, 'base64').toString('ascii');

  const [username, password] = credentials.split(':');
  
  // Проверка имени пользователя и пароля
  if (username === config.get('AUTH_USERNAME') && password === config.get('AUTH_PASSWORD')) return next()
  
  res.status(401).send('Требуется авторизация');
  
})

// Обработка GET-запросов
app.get('/', (req, res) => res.send('It`s work!'))

// вернет путь к базе данных
app.get('/getdb', (req, res) => {
  const requestData = req.body; // получаем данные из тела запроса

  // Отправляем ответ с данными
  res.json({ db: config.get('DB_PATH') })
})

app.post('/ping', (req, res) => {
  const requestData = req.body; // получаем данные из тела запроса
  res.json({ pong:  true, requestData })
})

app.post('/task/add', async (req, res) => {
  
  const data = JSON.stringify(req.body)
  const hashdata = crypto.createHash('sha256').update(data).digest('hex')
  const time = (new Date()).getTime()

  try{
    const row = await db.get('SELECT * FROM tasks WHERE hashdata = ?', [hashdata])

    if (row) {
      return res.json({ message: 'Дублирование запроса, данные уже существуют', error: 'duplicate', row })
    }
    
    const { lastID } = await db.run('INSERT INTO tasks (data, hashdata, created) VALUES (?, ?, ?)', [data, hashdata, time])
    return res.json({ id: lastID })
  }
  catch(e){
    return res.json({ message: e.message, error: 'catch' })
  }
})

app.post('/task/status', async (req, res) => {

  const { id } = req.body

  console.log(req.body);

  try{
    const row = await db.get('SELECT * FROM tasks WHERE id = ?', [id])

    if (!row) {
      return res.json({ message: 'Задание не найдено', error: row  })
    }
    
    const { status } = row
    return res.json({ id, status })
  }
  catch(e){
    return res.json({ message: e.message,  error: 'catch' })
  }
})

app.post('/task/get', async (req, res) => {
  
  const { id } = req.body

  try{
    const row = await db.get('SELECT * FROM tasks WHERE id = ?', [id])
    return row ? res.json(row) : res.json({ message: 'Задание не найдено', error: row  })
  }
  catch(e){
    return res.json({ message: e.message,  error: 'catch' })
  }
})

// Запуск сервера
app.listen(port, '0.0.0.0', () => {
  console.log(`Сервер запущен на порту ${port}`);
});
